package com.shujia;

import com.shujia.connectionPool.ConnectionPoolManager;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class ConnectionPoolOperation {
    public static void main(String[] args) throws SQLException {
        /*
            编写连接池的过程：
                1.创建一个配置类对象，将所需要的配置信息，存放至connectionPool.properties
                      添加Mysql配置信息
                      添加连接池配置信息
                2.创建一个接口，来规定连接池的规范
                    1.创建连接 -> 每次执行都可以返回一个连接对象
                    2.获取连接 -> 每次可以从集合中获取一个连接对象
                    3.释放连接 -> 当连接被使用完成后，那么需要重新放置连接池集合中

                3.连接池中的每个连接对象，包装成一个类

                4.创建一个连接池类实现连接池接口
                    1.创建一个集合 该集合用于保存所有未使用的连接
                    2.创建一个集合 该集合用于保存所有正在使用的连接

                    3.重写创建连接的方法 createOneConnection

                    4.在构造方法中，可以循环创建对应多个连接对象

                    5.重写获取连接方法
                        5.1 如果有连接那么直接返回
                        5.2 如果没有连接，那么当前连接总数没有达到上限,那么就创建
                        5.3 如果连接总数达到上限了，那么可以等待别的线程对连接进行释放 再获取

                    6.重写释放连接方法
                        1.需要遍历当前所有正在使用的连接，找到相同的连接后，将该连接从使用的集合中移动到未使用的集合中
                        2.需要唤醒一个等待的线程

                5.需要有一个管理工具类，创建一个连接池对象，然后对外提供get 和 release 方法

         */

//        Connection connection1 = ConnectionPoolManager.getConnection();
//        Connection connection2 = ConnectionPoolManager.getConnection();
//        Statement statement = connection1.createStatement();
//        Statement statement1 = connection2.createStatement();


        MyThread myThread = new MyThread();


        for (int i = 1; i <= 12; i++) {
            Thread thread = new Thread(myThread, "线程:" + i);
            thread.start();
        }
        System.out.println("程序未结束...");
        while (true){

        }
    }
}


class MyThread implements Runnable {

    @Override
    public void run() {
        Connection connection = ConnectionPoolManager.getConnection();

        try {
            System.out.println(Thread.currentThread().getName()+": SQL正在执行");
            Thread.sleep(5000);

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        ConnectionPoolManager.releaseConnection(connection);

    }
}

